package com.xbongbong.saas.model;

import com.xbongbong.paas.toolbox.exception.XbbException;
import com.xbongbong.paas.toolbox.wrap.IModel;
import com.xbongbong.saas.domain.entity.BusinessProductEntity;
import com.xbongbong.saas.domain.entity.ProductionOrderProductEntity;

import java.util.List;
import java.util.Map;

/**
 * @author long.rao
 * @version v1.0
 * @date 2019/2/21 14:29
 * @since v1.0
 */
public interface ProductionOrderProductModel extends IModel<ProductionOrderProductEntity> {
    /**
     * 生产单产品数据插入
     *
     * @param entity BOM单协同团队实体
     * @throws XbbException 异常
     * @return Integer
     * @author long.rao
     * @date 2019-02-01 15:24
     */
    @Override
    Integer insert(ProductionOrderProductEntity entity) throws XbbException;

    /**
     * 批量插入
     * @param insetBatchList
     */
    void inserBatch(List<ProductionOrderProductEntity> insetBatchList) throws XbbException;

    /**
     * 批量更新
     *
     * @param list 数据
     * @param corpid 公司ID
     * @author long.rao
     * @date 2019-07-06 11:25
     */
    Integer updateBatch (List<ProductionOrderProductEntity> list, String corpid) throws XbbException;

    Integer updateOutstockBatch (List<ProductionOrderProductEntity> list, String corpid) throws XbbException;

    /**
     * 生产单产品数据更新
     *
     * @param entity 生产单产品实体
     * @author long.rao
     * @date 2019-02-01 15:24
     * @throws XbbException 异常
     * @return Integer
     */

    @Override
    Integer update(ProductionOrderProductEntity entity) throws XbbException;
    /**
     * 生产单产品数据查询多个
     *
     * @param param 参数
     * @author long.rao
     * @date 2019-02-01 15:24
     * @return List<ProductionOrderProductEntity>
     */
    @Override
    List<ProductionOrderProductEntity> findEntitys(Map<String, Object> param);
    /**
     * 生产单产品数据查询条数
     * @param param 参数
     * @author long.rao
     * @date 2019-02-01 15:24
     * @return Integer
     */
    @Override
    Integer getEntitysCount(Map<String, Object> param);
    /**
     * 生产单产品数据单条查询
     * @param key 主键ID
     * @param corpid 公司ID
     * @author long.rao
     * @date 2019-02-01 15:24
     * @return Integer
     */
    ProductionOrderProductEntity getByKey(Long key, String corpid);
    /**
     * 保存实体
     *
     * @param bomUserEntity 生产单产品实体
     * @return java.lang.Integer
     * @throws XbbException 数据库异常
     * @author long.rao
     * @date 2019-02-17 16:47
     */
    Integer save(ProductionOrderProductEntity bomUserEntity) throws XbbException;

    /**
     * 根据生成单id获取对应的类型的产品
     * @param productionOrderId 生产单id
     * @param corpid 公司ID
     * @param productType 产品类型，1：成品；2：物料；null：获取全部
     * @author lcx
     * @date 2019-02-01 15:19
     */
    List<ProductionOrderProductEntity> getProductsById(Long productionOrderId, String corpid, Integer productType);

    /**
     * 根据生成单id获取对应的类型的产品
     * @param productionOrderId 生产单id
     * @param corpid 公司ID
     * @param productType 产品类型，1：成品；2：物料；null：获取全部
     * @param delIn
     * @author 吴峰
     * @date 2021/9/16 14:36
     */
    List<ProductionOrderProductEntity> getProductsById(Long productionOrderId, String corpid, Integer productType, List<Integer> delIn);

    /**
     * 批量删除生产单的关联产品
     * @author 吴峰
     * @date 2019/3/6 20:56
     * @param productOrderIdIn 要删除的关联的生产单的id
     * @param corpid 公司id
     * @return java.lang.Integer
     * @throws XbbException 业务异常
     */
    Integer deleteByProOrderIdIn(List<Long> productOrderIdIn, String corpid);

    /**
     * 获取生产单关联的成品
     *
     * @param proOrderId 生产单id
     * @param corpid 公司id
     * @return 生产单产品
     */
    ProductionOrderProductEntity findFinishedProduct(Long proOrderId, String corpid);

    Integer dataConsistencyUpdate(String corpid, Long productId, String productName, String specification, String productNo);

    List<BusinessProductEntity> findProductNum(Map<String,Object> param);

    Long isProductSubAttrExist(String attr, String corpid, Integer type, Integer isArray);

    List<String> getCorpids();

    Integer findProductNumCount(Map<String, Object> param);

    /**
     * 子表单数字字段汇总
     * @param corpid 公司id
     * @param field 需要汇总的字段
     * @param refId 单据id
     * @param productIdIn 单据在该产品关联的产品id 如生产单有物料产品和成品产品 refId为生产单id productIdIn为物料产品的id
     * @return
     */
    Double summaryByAttr(String field,String corpid,  Long refId,List<Long> productIdIn,Integer type);

    Double summaryByAttrFromOutSide(String field,String corpid,  Long refId,List<Long> productIdIn,Integer type);

    Double calcuateByAttrFromOutSide(String field1, String field2, String corpid, Long refId, List<Long> productIdIn,Integer type);

    Long countProductSub(String attr, String corpid, Integer type, Integer isArray);

    List<ProductionOrderProductEntity> getProductWithSubData(String attr, String corpid, Integer type, Integer isArray, Long idGte, Integer limit);

    /**
     * 删除产品
     * @param productList
     * @param corpid
     * @return
     */
    Integer deleteBatch(List<Long> productList, String corpid, Integer del);

    /**
     * 批量更新
     * @param list
     * @param corpid
     * @return java.lang.Integer
     * @author 吴峰
     * @date 2021/7/27 14:08
     */
    Integer updateMulti(List<ProductionOrderProductEntity> list, String corpid);
}
